// type StatusCode = 200 | 302 | 400 | 500;

import { post } from 'request';

// interface Res {
//   status: (statusCode: StatusCode) => Res;
//   send: (content: unknown) => Res;
// }

// type Method = 'GET' | 'POST' | 'PUT';

// interface Req<M, P extends string> {
//   method: M;
//   params: Record<P, number>;
// }

// type Callback<M extends Method, P extends string> = (req: Req<M, P>, res: Res) => void;

// type GetParams<U> = U extends `${string}/:${infer P}/${infer O}` ?
//   P | GetParams<`/${O}`> :
//   U extends `${string}/:${infer P}` ? P : never;

// const app = {
//   get<U extends string>(url: U, callback: Callback<'GET', GetParams<U>>): void {
//     // todo
//   },
// };


// type Method = 'get' | 'post' | 'put'

// type Status = 200 | 302 | 404 | 500


// type Req<M, T extends string> = {
//     method: M,
//     params: Record<T, number>
// }


// type Res = {
//     status(status: Status): Res,
//     send(content: unknown): Res,
// }

// type GetParams<U> = U extends `/${string}/:${infer P}/${infer O}` ?
//     P | GetParams<`/${O}`> : U extends `${string}/:${infer P}` ? P : never;

// type Callback<M extends Method, T extends string> = (req: Req<M, T>, res: Res) => void

// const app = {
//     get<U extends string>(url: U, callback: Callback<'get',GetParams<U>>):void {
//         // todo
//     }
//  }
// type Req<M, U extends string> = {
//     method: M,
//     params: Record<U, number>
// }

// type StatusCode = 100 | 200 | 201
//                 | 301 | 302 | 304
//                 | 401 | 403 | 404
//                 | 500 | 502 | 504

// type Res = {
//     status(statusCode: StatusCode): Res,
//     send(content: unknown): Res
// }

// type GetParams<U> = U extends `${string}/:${infer P}/${infer O}`? P | GetParams<`/${O}`> : U extends `${string}/:${infer P}`? P : never

// type Method = 'get' | 'post' | 'put' | 'delete'

// type CallBack<M extends Method, U extends string> = (req: Req<M, GetParams<U>>, res: Res) => void

// const app = {
//     get<U extends string>(url: U, callback: CallBack<'get', U>): void {
//         // todo
//     },
// }


// app.get('/user/:userId/:goodsId/:otherId', (req, res) => {
//     if (req.method === 'post') {
//         res.status(20).send({
//             success: true,
//             id: req.params.,
//         });
//     }
// });


// import { WEBSOCKET_ENABLE } from '@constants';
// import { isStatic } from '@utils';
// function fetchUrl() {
//     const { host } = window.location;
//     const isLocal = host.indexOf('huanleguang.com') === -1;

//     return isLocal ? process.env.WEB_SOCKET_URL : `wss://${host}/websocket`;
// }

// let websocket;
// let lockReconnect;
// let recontentTimer = null;
// const handlerList = [];
// const url = fetchUrl();

// function websocketReconnect() {
//     if (lockReconnect) return;
//     lockReconnect = true;

//     // 没连接上会一直重连，设置延迟避免请求过多
//     if (recontentTimer) {
//         clearTimeout(recontentTimer);
//     }

//     recontentTimer = setTimeout(() => {
//         console.log('websocketReconnect');
//         createWebSocket();
//         lockReconnect = false;
//     }, 5000);
// }

// function websocketInit() {
//     const data = {};

//     const heartCheck = {
//         timeout: 30000,
//         timeoutObj: null,
//         serverTimeoutObj: null,
//         start() {
//             const self = this;
//             const { timeout } = this;

//             if (this.timeoutObj) {
//                 clearTimeout(this.timeoutObj);
//             }
//             if (this.serverTimeoutObj) {
//                 clearTimeout(this.serverTimeoutObj);
//             }

//             this.timeoutObj = setTimeout(() => {
//                 websocket.send(JSON.stringify({
//                     ...data,
//                     api: 'ping',
//                 }));
//                 self.serverTimeoutObj = setTimeout(() => {
//                     websocket.close();
//                 }, timeout);
//             }, timeout);
//         },
//     };

//     websocket.addEventListener('open', () => {
//         websocket.send(JSON.stringify({
//             ...data,
//             api: 'ping',
//         }));

//         websocket.push = (info) => {
//             websocket.send(JSON.stringify({
//                 ...data,
//                 info,
//                 action: 'push',
//                 api: 'ping',
//             }));
//         };

//         heartCheck.start();
//     });

//     websocket.addEventListener('error', (e) => {
//         console.log('websocket error', e);
//         websocketReconnect();
//     });

//     websocket.addEventListener('close', (e) => {
//         console.log('websocket close', e);
//         websocketReconnect();
//     });

//     websocket.addEventListener('message', () => {
//         heartCheck.start();
//     });
// }

// function createWebSocket() {
//     const noop = () => {};
//     if (WEBSOCKET_ENABLE && !isStatic() && url) {
//         try {
//             websocket = new WebSocket(url);
//         } catch (e) {
//             console.error(e);
//         }
//     }

//     if (!websocket) {
//         websocket = {
//             addEventListener: noop,
//             push: noop,
//             send: noop,
//             disabled: true,
//         };
//     }

//     websocketInit();

//     websocket.add = function (handler) {
//         if (handlerList.includes(handler)) return;
//         handlerList.push(handler);
//     };

//     websocket.remove = function (handler) {
//         if (!handlerList.includes(handler)) return;
//         handlerList.splice(handlerList.findIndex(item => item === handler), 1);
//     };

//     websocket.addEventListener('message', (e) => {
//         handlerList.forEach(handler => handler(JSON.parse(e.data), e));
//         // if (!handlerList.includes(handler)) return;
//         // handler(JSON.parse(e.data), e);
//     });

//     return websocket;
// }

// createWebSocket();

// /**
//  * @description 暴露 websocket
//  * @returns
//  */
// export function getWebSocket() {
//     return websocket;
// }


// export class WebSocket {
//     constructor(heartTime = 3000, reconnectTime = 5000) {
//         this.websocket = null;
//         this.reconnentId = null;
//         this.lockReconnect = false;
//         this.handlerList = [];
//         this.heartTime = heartTime;
//         this.reconnectTime = reconnectTime;

//         this.create();
//     }

//     create() {
//         const noop = () => {};

//         if (this.url) {
//             try {
//                 this.websocket = new WebSocket(this.url);
//             } catch (e) {
//                 console.error(e);
//             }
//         }

//         if (!this.websocket) {
//             this.websocket = {
//                 addEventListener: noop,
//                 push: noop,
//                 send: noop,
//                 disabled: true,
//             };
//         }

//         this.init();

//         this.websocket.add = function (handler) {
//             if (this.handlerList.includes(handler)) return;
//             this.handlerList.push(handler);
//         };

//         this.websocket.remove = function (handler) {
//             if (!this.handlerList.includes(handler)) return;
//             this.handlerList.splice(this.handlerList.findIndex(item => item === handler), 1);
//         };

//         this.websocket.addEventListener('message', (e) => {
//             this.handlerList.forEach(handler => handler(JSON.parse(e.data), e));
//         });

//         return this.websocket;
//     }

//     init() {
//         const data = {};
//         const heartCheck = {
//             timeoutId: null,
//             serverTimeoutId: null,

//             // 心跳机制
//             start() {
//                 const self = this;

//                 if (this.timeoutId) {
//                     clearTimeout(this.timeoutId);
//                 }

//                 if (this.serverTimeoutId) {
//                     clearTimeout(this.serverTimeoutId);
//                 }

//                 this.timeoutId = setTimeout(() => {
//                     this.websocket.send(JSON.stringify({
//                         ...data,
//                         api: 'ping',
//                     }));

//                     self.serverTimeoutId = setTimeout(() => {
//                         this.websocket.close();
//                     }, this.heartTime);
//                 }, this.heartTime);
//             },
//         };

//         this.websocket.addEventListener('open', () => {
//             this.websocket.send(JSON.stringify({
//                 ...data,
//                 api: 'ping',
//             }));

//             heartCheck.start();
//         });

//         this.websocket.addEventListener('error', (e) => {
//             console.log('websocket error', e);
//             this.reconnect();
//         });

//         this.websocket.addEventListener('close', (e) => {
//             console.log('websocket close', e);
//             this.reconnect();
//         });

//         this.websocket.addEventListener('message', () => {
//             heartCheck.start();
//         });
//     }

//     reconnect() {
//         if (this.lockReconnect) return;
//         this.lockReconnect = true;

//         // 没连接上会一直重连，设置延迟避免请求过多
//         if (this.reconnentId) {
//             clearTimeout(this.reconnentId);
//         }

//         this.reconnentId = setTimeout(() => {
//             console.log('websocketReconnect');
//             this.createWebSocket();
//             this.lockReconnect = false;
//         }, this.reconnectTime);
//     }

//     get url() {
//         // 可根据项目灵活更改
//         const { host } = window.location;
//         const isLocal = host.indexOf('线上域名') === -1;

//         return isLocal ? process.env.WEB_SOCKET_URL : `wss://${host}/websocket`;
//     }
// }
